#include "util.h"

/**
 * URL编码函数（与 urlDecode 对应）
 * 对特殊字符进行 %XX 编码，空格编码为 +（符合 application/x-www-form-urlencoded 标准）
 * @param value 需要编码的字符串
 * @return 编码后的字符串
 */
QString urlEncode(const QString& value) {
    QByteArray byteArray = value.toUtf8(); // 先转为UTF-8字节数组
    QString result;

    for (char c : byteArray) {
        // 无需编码的字符：字母、数字、- _ . ~
        if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') ||
            c == '-' || c == '_' || c == '.' || c == '~') {
            result += QChar(c);
        } else if (c == ' ') {
            // 空格编码为 +（查询参数中）
            result += '+';
        } else {
            // 其他字符按 %XX 编码（XX为十六进制）
            result += QString("%%1").arg(static_cast<unsigned char>(c), 2, 16, QLatin1Char('0')).toUpper();
        }
    }

    return result;
}

// 支持 std::string 输入的重载
std::string urlEncode(const std::string& value) {
    return urlEncode(QString::fromUtf8(value.c_str())).toStdString();
}

// UTF-8编码工具（确保数据编码正确）
QByteArray utf8Encode(const QString& str) {
    return str.toUtf8();  // 转为UTF-8字节数组
}

QString utf8Decode(const QByteArray& bytes) {
    // 严格校验UTF-8编码，避免乱码
    return QString::fromUtf8(bytes.constData(), bytes.size());
}
